class Solution:
    def __init__(self):
        self.list1 = []
        self.list2 = []
        self.flag = 0
        self.num = -1

    def countAndSay(self, n: int) -> str:
        strr = '1'
        if n == 1:
            return strr

        return self.countAndSay2(strr, n - 1)

    def countAndSay2(self, strr: str, n: int):

        self.list1 = list(strr)
        self.flag = 0
        self.num = -1
        self.list2 = []
        for i in range(len(self.list1)):
            if self.num == -1:
                self.num = int(self.list1[i])
                self.flag = self.flag + 1
                continue
            if self.num == int(self.list1[i]):
                self.flag = self.flag + 1
            else:
                self.list2.append(str(self.flag) + str(self.num))
                self.num = int(self.list1[i])
                self.flag = 1
        if self.flag != 0:
            self.list2.append(str(self.flag) + str(self.num))
        if (n - 1 == 0):

            return ''.join(self.list2)
        else:
            return self.countAndSay2(''.join(self.list2), n - 1)



"""
迭代替代递归：
countAndSay 方法中使用了一个循环来生成第 n 项的外观数列，每次调用 generate_next 方法生成下一项，而不是递归调用。
直接在字符串上操作：
generate_next 方法中直接在字符串 s 上进行遍历和拼接，避免了多次列表转换。
高效字符串拼接：
使用 join 方法将列表 next_str 转换为字符串，而不是使用 + 操作符。
这些优化措施可以显著提高代码的执行效率，特别是在生成较大项数的外观数列时
"""

lll = Solution()
print(lll.countAndSay(5))
